/*
 * Field.java
 *
 * Created on 2007. m�rcius 25., 14:49
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package lemmingsproto;

import java.util.*;

/**
 *
 * @author attila
 * A p�lya egy mez�j�t reprezen�l� oszt�ly
 */
public class Field {
    
    private Field [] neighbours; //0: fenn; 1: bal; 2: lenn; 3:jobb
    private ArrayList<Lemming> lemmings;
    private FieldProp prop;
    
    /** Konstruktor */
    public Field() {
        
        neighbours = new Field[4];
        lemmings = new ArrayList<Lemming>();
        lemmings.clear();
        prop=new Empty(this);
        System.out.println("field_init");
    }
    /**
    * @param n
    * A szomsz�d helyzete: 0: fels�; 1: bal; 2: als�; 3:jobb
    * @return
    * A cella egyik szomsz�d cell�ja
    */
    public Field getNeighbour(int n) {
        if (n<4 && n>=0) {
            if (neighbours[n]!=null)
                System.out.println("  > Field.getNeighbour("+n+") -> Field");
            else
                System.out.println("  > Field.getNeighbour("+n+") -> null");
            return neighbours[n];
        }
        System.out.println("  > Field.getNeighbour("+n+") -> null");
        return null;
    }
    /**
    * �j szomsz�dot f�z a cella mell�
    * @param f
    * A leend� szomsz�d
    * @param n
    * A szomsz�d helyzete: 0: fels�; 1: bal; 2: als�; 3:jobb
    */
    public void setNeighbour(Field f, int n) {
        if (n<4 && n>=0)
            neighbours[n]=f;
        return;
    }
    /**
     * Megh�vja az �sszes cell�n �ll� lemming <code>action()</code> f�ggv�ny�t
     */
    public void action() {
        Lemming current;
        //Iterator<Lemming> li;

        //li=lemmings.iterator();
        System.out.println("@ Field.action() - �sszesen "+lemmings.size()+" lemming van a mez�n.");
        
        /*
        try{                
        while (li.hasNext()) {

         current=li.next();
            if (current!=null)
                current.action(this);
        }
        }catch(NoSuchElementException nsee){
        
        }*/
        for (int i=0; i<lemmings.size(); i++) {
            current=lemmings.get(i);
            current.action(this);
        }
        
        // A field b�vebb actionje
        prop.onMe();
        
        return;
    }
    
    public void setLemmingActionFlagNull() {
      Lemming current;
      for (int i=0; i<lemmings.size(); i++) {
            current=lemmings.get(i);
            current.nullActionFlag();
      }
    }
    /**
    * Eszk�z hozz�rendel�se egy mez�n �ll� lemminghez
    * @param t
    * A hozz�rendelend� eszk�z
    * @return 
    * TRUE ha siker�lt az eszk�zt egy mez�n �ll� lemminghez rendelni
    */
    public boolean addTool(Tool t) {
        Lemming tmplem;
        System.out.println("> Field.addTool()");
        if (lemmings.size()>0) {
            tmplem=lemmings.get(0);
            System.out.println("field_get_lemming");
            tmplem.addTool(t);
            //t.setLemming(tmplem);
         
            return true;
        }
        return false;
    }
    /**
    * Meg�li a mez�n �ll� �sszes lemminget
    * @return
    * A legyilkolt lemmingek sz�ma
    */
    public int killLemmings() {
        int size;
        
        size=lemmings.size();
        lemmings.clear();
        
        System.out.println("field_explode "+size);
        
        return size;
    }
    /**
    * Lemming �thelyez�se szomsz�dos cell�ra
    * @param l
    * Lemming, amit t kell helyezni 
    * @param n
    * irny, ahova t kell helyezni
    */
    public boolean replaceLemming(Lemming l, int n) {
        System.out.println("> Field.replaceLemming()");
        if (neighbours[n]!=null && neighbours[n].prop.wannaGo()) {
            //lemmings.remove(l);
            
            ListIterator li=lemmings.listIterator();
            while(li.hasNext()){
                Lemming tmp=(Lemming)li.next();
                if (tmp.getId()==l.getId()) li.remove();
            }
            neighbours[n].getLemming(l);
            return true;
        }
        return false;
    }
    /**
     * Lemminget helyez a mez�re
     */
    public void getLemming(Lemming l) {
        System.out.println("> Field.getLemming() - a mez� lemminget kapott");
        lemmings.add(l);
        System.out.println("@ ollo");
        return;
    }
    
    /**
    * A mez� t�pus�nak be�ll�t�sa
    * @param p
    * [TODO] nincs param�tere!
    * @return
    * [TODO] kell ilyen nek�nk?
    */
    public void setProp(FieldProp p) {
        prop=p;
        System.out.println("field_add_type");
        return;
    }
    public String toString(){
    	if (lemmings.size()>0) {
            Integer i=new Integer(lemmings.size());
            return i.toString();
        }
        else return prop.toString();
    }
}
